package com.datastructure.hashtable;

/**
 * @author: 临晖
 * @date: 2023/10/13
 * @description:
 */


import java.util.ArrayList;
import java.util.HashMap;
import java.util.HashSet;
import java.util.List;

/**
 * 俩个数组的交集
 */
public class Solution02 {


    /**
     * 给定两个数组 nums1 和 nums2 ，返回 它们的交集 。输出结果中的每个元素一定是 唯一 的。我们可以 不考虑输出结果的顺序 。
     *
     * @param nums1
     * @param nums2
     * @return
     */
    public static int[] intersection(int[] nums1, int[] nums2) {

        //思路一 3ms
        //HashMap<Integer, Integer> map = new HashMap<>();
        //HashSet<Integer> list = new HashSet<>();
        //
        //for (int i = 0; i < nums1.length; i++) {
        //    map.put(nums1[i], 1);
        //}
        //
        //for (int i = 0; i < nums2.length; i++) {
        //    Integer num = map.getOrDefault(nums2[i], 0);
        //    num++;
        //    if (num == 2) {
        //        list.add(nums2[i]);
        //    }
        //}
        //int[] ans = new int[list.size()];
        //int i = 0;
        //for (Integer x : list) {
        //    ans[i++] = x;
        //}
        //
        //return ans;

        //思路二：2ms
        HashSet<Integer> set = new HashSet<>();
        HashSet<Integer> ans = new HashSet<>();

        int len1 = nums1.length;
        int len2 = nums2.length;

        //if (len1 < len2) {
        for (int i = 0; i < len1; i++) {
            set.add(nums1[i]);
        }

        for (int i = 0; i < len2; i++) {
            if (set.contains(nums2[i])) {
                ans.add(nums2[i]);
            }
        }
        //} else {
        //    for (int i = 0; i < len2; i++) {
        //        set.add(nums2[i]);
        //    }
        //
        //    for (int i = 0; i < len1; i++) {
        //        if (set.contains(nums1[i])) {
        //            ans.add(nums1[i]);
        //        }
        //    }
        //}

        int[] res = new int[ans.size()];
        int i = 0;
        for (Integer x : ans) {
            res[i++] = x;
        }

        return res;


    }


    /**
     * 给你两个整数数组 nums1 和 nums2 ，请你以数组形式返回两数组的交集。返回结果中每个元素出现的次数，应与元素在两个数组中都出现的次数一致
     * （如果出现次数不一致，则考虑取较小值）。可以不考虑输出结果的顺序。
     * @param nums1
     * @param nums2
     * @return
     */
    public int[] intersect(int[] nums1, int[] nums2) {
        HashMap<Integer, Integer> map = new HashMap<>();
        ArrayList<Integer> list = new ArrayList<>();

        int len1 = nums1.length;
        int len2 = nums2.length;


        for (int i = 0; i < len1; i++) {
            Integer num = map.getOrDefault(nums1[i], 0);
            num++;
            map.put(nums1[i], num);
        }

        for (int i = 0; i < len2; i++) {
            if (map.get(nums2[i]) != null) {
                list.add(nums2[i]);
                Integer num = map.get(nums2[i]);
                num--;
                if (num == 0) {
                    map.remove(nums2[i]);
                } else {
                    map.put(nums2[i], num);
                }

            }
        }

        int[] ans = new int[list.size()];
        for (int i = 0; i < ans.length; i++) {
            ans[i] = list.get(i);
        }
        return ans;
    }


    public static void main(String[] args) {
        HashMap<Integer, Integer> map = new HashMap<>();
        System.out.println(map.get(1));
    }
}
